package com.javasm.springmybatis.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @Author：longjinyi
 * @Version：1.0
 * @Date：2021/12/30-19:23
 * @Since:jdk1.8
 * @Description:
 */
//controller包下的类要去调MyTask类里面的方法，而调用方法只能是MyTask类的对象来调用，
//所以要把MyTask类放入spring容器中
//注意：这个类所在的包的位置必须在springmybatis包下，不然包扫描扫描不到这个类

//企业开发中使用定时任务
//定义一个类放到容器中
//写注解和corn表达式
@Component
public class MyTask {

    //获取当前类打印日志的对象
    Logger logger = LoggerFactory.getLogger(MyTask.class);

    //使用 @Scheduled 注解指定执行注解下面的任务的具体时间
    //@Scheduled 的括号里面放指定任务执行的具体时间
    //corn表达式的格式：秒 分 时 日 月 周
    //这里  0是延迟时间   2是间隔时间
    //这里corn表达式的意思是：间隔2秒执行一次
    //定时任务默认只有一个线程，配置定时任务的线程数量在application.yml配置
//    @Scheduled(cron = "0/2 * * * * *")
//    public void doSomeThing() {
//
//        logger.info("start----1");
//        //获取当前线程名称
//        String name = Thread.currentThread().getName();
//        System.out.println("doSomeThing,当前线程名称========"+name);
//        System.out.println("excute two second");
//        logger.info("end------1");
//    }


    //间隔一秒执行一次
    //定时任务默认只有一个线程，即单线程，配置定时任务的线程数量在application.yml配置
//    @Scheduled(cron = "0/1 * * * * *")
//    public void doOtherThing() {
//
//        logger.info("start=====2");
//        //获取当前线程名称
//        String name = Thread.currentThread().getName();
//        System.out.println("doOtherThing,当前线程名称========"+name);
//        System.out.println("excute per second");
//        logger.info("end=======2");
//    }


    //fixedDelay:延迟时间
    //第一次任务结束时间与第二次任务开启时间
    //第一次任务结束之后，延迟五秒执行第二次任务，依次类推
//    @Scheduled(fixedDelay = 5000)
//    public void fun() {
//        logger.info("start*********3");
//        try {
//            TimeUnit.SECONDS.sleep(6);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        System.out.println("333333333333333333333333333");
//        logger.info("end*********3");
//    }


    //fixedRate：间隔时间
    //第一次开始执行的时间到第二次开始执行时间的间隔
//    @Scheduled(fixedRate = 2000)
//    public void dofixedRateThing(){
//
//        logger.info("start~~~~~~~~~~~4");
//        //当睡眠时间大于间隔时间时：
//        //设置的间隔时间失效，生效的是睡眠时间，相当于延迟时间fixedDelay
//        //睡眠时间，单个线程开始到结束，延迟了5秒
//        //间隔时间指的任务之间开始的间隔时间是5秒
//
//        //当睡眠时间小于间隔时间时：
//        //睡眠时间生效，单个线程开始到结束，延迟了2秒
//        //间隔时间指的任务之间开始的间隔时间是5秒
//        try {
//            TimeUnit.SECONDS.sleep(5);
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//
//        logger.info("end~~~~~~~~~~~~~4");
//        String name = Thread.currentThread().getName();
//        System.out.println("dofixedRate==========="+name);
//        System.out.println("dofixedRate...........");
//
//    }


    //fixedRate：间隔时间
    //第一次开始执行的时间到第二次开始执行时间的间隔
//    @Scheduled(fixedRate = 2000)
//    public void dofixedRateThing111(){
//
//        logger.info("start》》》》》》4");
//        String name = Thread.currentThread().getName();
//        System.out.println("dofixedRateThing111==========="+name);
//        System.out.println("dofixedRateThing111...........");
//        logger.info("end》》》》》》4");
//    }

    //fixedRate 和 fixedDelay 不能一块用，否则会报错
    //错误信息：Encountered invalid @Scheduled method 'dofixedRateThing111': Exactly one of the 'cron', 'fixedDelay(String)',
    //or 'fixedRate(String)' attributes is required
    //@Scheduled注解的括号里面，cron、fixedDelay、fixedRate 这三个只能根据需求选一个用，不能放多个
//    @Scheduled(fixedRate = 2000,fixedDelay=1000)
//    public void dofixedRateThing111(){
//
//        logger.info("start》》》》》》4");
//        String name = Thread.currentThread().getName();
//        System.out.println("dofixedRateThing111==========="+name);
//        System.out.println("dofixedRateThing111...........");
//        logger.info("end》》》》》》4");
//    }


    //适用场景：
    //1.如果想在几分几秒，指定的具体时间点去执行的话，就用corn表达式
    //2.如果想执行任务有时间间隔或者延迟一段时间执行，就用fixedRate或者fixedDelay
}
